package ar.edu.frba.utn.dds.Busqueda;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import ar.edu.frba.utn.dds.Aerolinea.AeroLinea;
import ar.edu.frba.utn.dds.Vuelo.Asiento;
import ar.edu.frba.utn.dds.Vuelo.Vuelo;

import com.oceanic.AerolineaOceanic;
import com.oceanic.AsientoDTO;

public class BusquedaOceanic implements BusquedaInterface{
private static AerolineaOceanic aeroOceanic = AerolineaOceanic.getInstance();
	
	public void buscarVuelosDisponibles(AeroLinea aeroLinea, Vuelo vueloDeseado){
		List<Vuelo> vuelos = new ArrayList<Vuelo>();
		List<Asiento> tmpAsientos = new ArrayList<Asiento>();
		List<AsientoDTO> asientos = new ArrayList<AsientoDTO>();
		int contadorAsientos = 0;
		
		if (vueloDeseado.getOrigen() != null && vueloDeseado.getFechaSalida() != null){
			if (vueloDeseado.getDestino()!= null){
				asientos = aeroOceanic.asientosDisponiblesParaOrigenYDestino(vueloDeseado.getOrigen(),
						vueloDeseado.getDestino(), vueloDeseado.getFechaSalida());
			}else{
				asientos = aeroOceanic.asientosDisponiblesParaOrigen(vueloDeseado.getOrigen(),
						vueloDeseado.getFechaSalida());
			}
		}
		
		Iterator<AsientoDTO> asiento = asientos.iterator();
		
		while (asiento.hasNext()) {
			AsientoDTO tmpAsientoDTO = asiento.next();
			String estadoAsiento;
			
			if (tmpAsientoDTO.getReservado()){
				estadoAsiento="R";
			}else{
				estadoAsiento="D";
			}
			
			tmpAsientos.add(aeroLinea.getConversorAerolinea().convertirAsiento(tmpAsientoDTO.getCodigoDeVuelo(),tmpAsientoDTO.getNumeroDeAsiento(),
					tmpAsientoDTO.getFechaDeSalida(),tmpAsientoDTO.getFechaDeLlegada(),
					tmpAsientoDTO.getHoraDeSalida(), tmpAsientoDTO.getHoraDeLlegada(),
					tmpAsientoDTO.getPrecio(), estadoAsiento, 
					tmpAsientoDTO.getReservado(), tmpAsientoDTO.getClase(),
					tmpAsientoDTO.getOrigen(), tmpAsientoDTO.getDestino(),
					tmpAsientoDTO.getUbicacion(), contadorAsientos));
			contadorAsientos+=1;
			
		}
		
		Iterator<Asiento> iterateAsiento = tmpAsientos.iterator();
		
		while (iterateAsiento.hasNext()){
			Asiento tmpAsiento = iterateAsiento.next();
			Iterator<Vuelo> iterateVuelos = vuelos.iterator();
			
			Boolean condicionVuelo = false;
			while(iterateVuelos.hasNext()){
				Vuelo vuelo = iterateVuelos.next();
				if (tmpAsiento.getOrigen().equalsIgnoreCase(vuelo.getOrigen())
						&& tmpAsiento.getDestino().equalsIgnoreCase(vuelo.getDestino())
						&& tmpAsiento.getFechaLlegada().equalsIgnoreCase(vuelo.getFechaLlegada())
						&& tmpAsiento.getFechaSalida().equalsIgnoreCase(vuelo.getFechaSalida())
						&& tmpAsiento.getHoraLlegada().equalsIgnoreCase(vuelo.getHoraLlegada())
						&& tmpAsiento.getHoraSalida().equalsIgnoreCase(vuelo.getHoraSalida())){
					condicionVuelo = true;
					tmpAsiento.setVuelo(vuelo);
					vuelo.getAsientosVuelo().add(tmpAsiento);
				}
			}
			
			if (!condicionVuelo){
				Vuelo newVuelo = new Vuelo(tmpAsiento.getCodigoVuelo(),tmpAsiento.getOrigen(), tmpAsiento.getFechaSalida(), 
						tmpAsiento.getHoraSalida(), tmpAsiento.getDestino(), tmpAsiento.getFechaLlegada(), tmpAsiento.getHoraLlegada());
				tmpAsiento.setVuelo(newVuelo);
				newVuelo.getAsientosVuelo().add(tmpAsiento);
				newVuelo.setAeroLinea(aeroLinea);
				aeroLinea.getVuelos().add(newVuelo);
			}
		}
	}
}
